﻿/////////////////////////////////////////////////
//文件名:Config
//描  述:
//创建者:刘凡平(Iveely Liu)
//邮  箱:945222889@qq.com
//组  织:Iveely
//年  份:2012/5/12 10:05:31
///////////////////////////////////////////////


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;

namespace IveelySE.BigData.MasterNode
{
    /// <summary>
    /// 主节点配置类
    /// </summary>
    public class Config
    {

        //public static Config GetInstance()
        //{
        //    return config;
        //}

        /// <summary>
        /// 构造方法
        /// </summary>
        public Config()
        {
            try
            {
                //读取配置文件
                string[] info = File.ReadAllLines("Master.config");//"0 33 36 32 31 30".Split(' ');// 
                //设置本地IP
                this.IP = info[0].Split(':')[1] != "0" ? IPAddress.Parse(info[0].Split(':')[1]) : Dns.GetHostEntry(Dns.GetHostName()).AddressList.Last();
                //设置用户写端口
                this.UserWritePort = int.Parse(info[1].Split(':')[1]);
                //设置用户读端口
                this.UserReadPort = int.Parse(info[2].Split(':')[1]);
                //设置主节点向子节点读端口
                this.MasterReadPort = int.Parse(info[3].Split(':')[1]);
                //设置主节点向子节点写端口
                this.MasterWritePort = int.Parse(info[4].Split(':')[1]);
                //设置子节点上线监听端口
                this.OnLineListenPort = int.Parse(info[5].Split(':')[1]);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        /// <summary>
        /// 本地IP地址
        /// </summary>
        public IPAddress IP { get; set; }

        /// <summary>
        /// 用户写端口
        /// </summary>
        public int UserWritePort { get; set; }

        /// <summary>
        /// 用户读端口
        /// </summary>
        public int UserReadPort { get; set; }

        /// <summary>
        /// 主结点向子节点读端口
        /// </summary>
        public int MasterReadPort { get; set; }

        /// <summary>
        /// 主结点向子结点写端口
        /// </summary>
        public int MasterWritePort { get; set; }

        /// <summary>
        /// 子节点上线监听端口
        /// </summary>
        public int OnLineListenPort { get; set; }

        /// <summary>
        /// 配置文件信息
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {

            StringBuilder Sb = new StringBuilder();
            Sb.AppendLine("主节点IP地址:" + IP.ToString());
            Sb.AppendLine("      用户向主节点写入端口:" + UserWritePort);
            Sb.AppendLine("      用户向主节点读取端口:" + UserReadPort);
            Sb.AppendLine("      主节点向子节点写入端口:" + MasterReadPort);
            Sb.AppendLine("      主节点向子节点读取端口:" + MasterWritePort);
            Sb.AppendLine("      主节点监听子结点上线端口:" + OnLineListenPort);
            return Sb.ToString();
        }

        private void ReWrite()
        {
            StringBuilder Sb = new StringBuilder();
            Sb.AppendLine("主节点IP地址:" + IP.ToString());
            Sb.AppendLine("用户向主节点写入端口:" + UserWritePort);
            Sb.AppendLine("用户向主节点读取端口:" + UserReadPort);
            Sb.AppendLine("主节点向子节点写入端口:" + MasterReadPort);
            Sb.AppendLine("主节点向子节点读取端口:" + MasterWritePort);
            Sb.AppendLine("主节点监听子结点上线端口:" + OnLineListenPort);
            File.WriteAllText("Master.config", Sb.ToString());
            Common.Printf.WriteInfo("配置文件已经覆盖。");
        }

        public void Modify(string[] info)
        {
            if (info.Length == 6)
            {
                //设置本地IP
                this.IP = info[0] != "0" ? IPAddress.Parse(info[0]) : Dns.GetHostEntry(Dns.GetHostName()).AddressList.Last();
                //设置用户写端口
                this.UserWritePort = int.Parse(info[1]);
                //设置用户读端口
                this.UserReadPort = int.Parse(info[2]);
                //设置主节点向子节点读端口
                this.MasterReadPort = int.Parse(info[3]);
                //设置主节点向子节点写端口
                this.MasterWritePort = int.Parse(info[4]);
                //设置子节点上线监听端口
                this.OnLineListenPort = int.Parse(info[5]);
                //重写入文件
                this.ReWrite();
            }
            else
            {
                Common.Printf.WriteError("重写配置文件失败，请检查输入信息是否正确。");
            }
        }
    }
}
